import { download, get, post } from '@/service/request'

export function getTableData(params: Partial<SearchParams>) {
  return get<PageDataResponse<WaybillData>>('/lxdd/concreteSaleOrder/concreteSaleOrderPageList', params)
}

export function exportTableData(data: Partial<SearchParams>) {
  return download({ url: '/lxdd/concreteSaleOrder/concreteSaleOrderPageList', data: { ...data, export: true } })
}
// 获取单个运单详情(主键)
export function getWaybillDetailById(params: { id: WaybillData['id'] }) {
  return get<WaybillDetail>('/lxdd/concreteSaleOrder/getConcreteSaleOrderById', params)
}
// 获取单个运单详情(单号)
export function getWaybillDetailByCode(params: { orderCode: WaybillData['orderCode'] }) {
  return get<WaybillDetail>('/lxdd/concreteSaleOrder/getConcreteSaleOrderByOrderCode', params)
}

export function updateExpStatus(data: any) {
  return post('/lxdd/concreteSaleOrder/modifyExpStatus', data)
}

// 获取运单历史围栏 oddType单据类型[1-运单, 2-订单]
export function getWaybillRail(params: { oddCode: string; oddType: 1 | 2 }) {
  return get<{ customerRails: RailRes[]; mixingStationRails: RailRes[] }>('/lxdd/rail/railTracksForOdd.html', params)
}

export interface SearchParams extends PageQuery {
  orderCodeFuzzy: string // 运单编号(模糊)
  waybillCodeFuzzy: string // 关联订单(模糊)
  carNumberFuzzy: string // 车牌号(模糊)
  carCodeFuzzy: string // 搅拌车号(模糊)
  customerNameFuzzy: string // 客户名称(模糊)
  engineeringNameFuzzy: string // 工程名称(模糊)
  mixingStationCode: string // 搅拌站编号
  buildPlaceFuzzy: string // 施工部位(模糊)
  orderStatus: 0 | 1 | 2 | 3 | 4 | 5 // 状态: 0装货中 1送货中 2待卸货(等待中) 3卸货中 4待签收 5已签收
  expStatus: 1 | 2 // 异常状态: 1正常 2异常
  timeType: 0 | 1 | 2 | 3 | 4 // 查询时间类型:0开始送货时间 1送达时间 2开始卸货时间 3卸货完成时间 4运单签收时间
  startTime: string // 开始时间
  endTime: string // 结束时间
}

export interface WaybillData {
  id: string
  customerCode: string // 客户编码
  customerName: string // 客户名称
  engineeringName: string // 工程名称
  buildPlace: string // 施工部位
  actualDeliveryAddress: string // 地址
  concreteStrengthGrade: string // 强度等级
  concreteSlump: string // 塌落度
  unloadWay: string // 卸料方式
  specialRequirements: string // 特殊要求
  actualVolume: number // 实际方量(单位: 立方米)
  ticketVolume: number // 票据数量(单位: 立方米)
  productionLine: string // 生产线
  transDistance: number // 运输距离(单位: km)
  orderStatus: 0 | 1 | 2 | 3 | 4 | 5 // 状态: 0装货中 1送货中 2待卸货(等待中) 3卸货中 4待签收 5已签收
  leaveTime: string // 开始送货时间
  arrivedTime: string // 送达时间
  startUnloadTime: string // 开始卸货时间
  unloadEndTime: string // 卸货完成时间
  signedTime: string // 运单签收时间
  orderCode: string // 运单编号
  waybillCode: string // 关联订单的编码
  contractCode: string // 合同编号
  mixingStationName: string // 所属站点
  carNumber: string // 车牌号
  carCode: string // 搅拌车号
  driverName: string // 司机姓名
  driverPhone: string // 司机电话
  expRemark: string // 异常备注
  receiveAddress: string // 卸货地址
  arrivedDuration: string // 送达时长(单位: 秒)
  createBy: string // 创建者
  createTime: string // 创建时间
  deviceId: string // 设备ID
  expStatus: 1 | 2 // 异常状态: 1正常 2异常
  mixingStationCode: string // 站点编码
  returnDuration: string // 返程时长(单位: 秒)
  returnEndTime: string // 返程结束时间
  unloadDuration: string // 卸货时长(单位: 秒)
  updateBy: string // 更新者
  updateTime: string // 更新时间
  waitUnloadDuration: string // 卸货等待时长(单位: 秒)
}

export type WaybillDetail = Pick<
  WaybillData,
  | 'id'
  | 'deviceId'
  | 'orderStatus'
  | 'concreteStrengthGrade'
  | 'orderCode'
  | 'concreteSlump'
  | 'waybillCode'
  | 'unloadWay'
  | 'contractCode'
  | 'specialRequirements'
  | 'mixingStationName'
  | 'actualVolume'
  | 'carNumber'
  | 'ticketVolume'
  | 'carCode'
  | 'productionLine'
  | 'driverName'
  | 'transDistance'
  | 'driverPhone'
  | 'customerName'
  | 'expStatus'
  | 'engineeringName'
  | 'expRemark'
  | 'buildPlace'
  | 'actualDeliveryAddress'
  | 'receiveAddress'
  | 'leaveTime' // 开始送货时间
  | 'arrivedDuration' // 送达时长(单位: 秒)
  | 'arrivedTime' // 送达时间
  | 'waitUnloadDuration' // 卸货等待时长(单位: 秒)
  | 'startUnloadTime' // 开始卸货时间
  | 'unloadDuration' // 卸货时长(单位: 秒)
  | 'unloadEndTime' // 卸货完成时间
  | 'returnDuration' // 返程时长(单位: 秒)
  | 'returnEndTime' // 返程结束时间
  | 'createTime'
>

export const enum LoadType {
  'Load' = 'Load',
  'Unload' = 'Unload'
}

export const enum RailShapeType {
  Circle = 0,
  Rectangle,
  Polygon
}

export interface RailData {
  address: string // 围栏地址
  lat: string // 标注点纬度
  lng: string // 标注点经度
  radius: number // 半径
  railType: 0 | 1 // [0-自定义, 1-行政区域]
  railData: string // 围栏数据
  railId: number // 围栏ID
  railStatus: 0 | 1 // 围栏状态[0-正常, 1-失效]
  shapeType: RailShapeType // 围栏形状[0-圆形, 1-矩形, 2-多边形]
  loadType: LoadType // 围栏类型
}
// 排除 interface 中某些项
// Exclude 排除 key
// Pick 提取未被排除的项
type ExcludeInterface<T, U> = Pick<T, Exclude<keyof T, U>>

export type RailRes = ExcludeInterface<RailData, 'loadType'>
